package com.example.demo.lock;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @desc: <br/>
 * @author: Jingbo Hu<br/>
 * @time：2020年07⽉16⽇<br/>
 * @version：v1.0.0<br>
 */
public class ConditionLockDemo {

    /**
     * 任意一个Java对象，都拥有一组监视器方法（定义在java.lang.Object上），主要包括wait()、
     * wait(long timeout)、notify()以及notifyAll()方法，这些方法与synchronized同步关键字配合，可以
     * 实现等待/通知模式。Condition接口也提供了类似Object的监视器方法，与Lock配合可以实现等
     * 待/通知模式，但是这两者在使用方式以及功能特性上还是有差别的
     */

    Lock lock = new ReentrantLock();
    Condition condition = lock.newCondition();


    public void conditionWait() throws InterruptedException {
        lock.lock();
        try {
            condition.await();
        } finally {
            lock.unlock();
        }
    }


    public void conditionSignal() throws InterruptedException {
        lock.lock();
        try {
            condition.signal();
        } finally {
            lock.unlock();
        }
    }

}
